Canigó - Servei de multiidioma 2.2
SERVEI DE MULTIIDIOMA
IntroduccióPropósitEl Servei de multiidioma té com a objectiu principal permetre el desenvolupament d'aplicacions en el que no sigui necessària cap reenginyeria cada vegada que s'incorpori un nou llenguatge a l'aplicació. En general tota aplicació internacionalitzada pot realitzar-se de 2 formes diferenciades:
La primera solució, fins ara utilizada en moltes pàgines Web, implica un cost gran de rèplica i manteniment, ja que qualsevol nou requeriment o canvi comporta realitzar més d'un desenvolupament, un per cada idioma. La segona solució, recomanada per canigo permet que:
Context i Escenaris d'ÚsEl Servei de Multiidioma es troba localitzat a la Capa de Presentació. El seu ús és necessari sempre i quan es requereixi de la internacionalització de les nostres aplicacions. En qualsevol cas encara que es faci ús d'un únic idioma a l'aplicació es recomana seguir la seva internacionalització per preveure futurs canvis i adaptacions. El Servei de Multiidioma és utilitzat pel framework entre d'altres pel:
Versions i DependènciesLes dependències descrites a la següent url son requerides per tal de compilar i fer funcionar el projecte: A qui va dirigitAquest document va dirigit als següents perfils:
Documents i Fonts de ReferènciaGlossarii18N (Internationalization) i18N o Internationalization (el 18 correspon a les 18 lletres que hi ha entre la I inicial i la n final) és el procés d'agafar una aplicació dissenyada i reestructurar-la per a que pugui ser usada en diferents localitats o bé definir el procés de crear-la per a ser totalment flexible per executar-se en qualsevol localitat. Java defineix les classes bàsiques d'ús de la internacionalizació. Descripció DetalladaArquitectura i ComponentsEl Servei es basa en l'ús de la internacionalització i18N. Seguint el patró comú a tots els serveis defineix una interfície i ofereix implementacions per diferents tecnologies específiques. Els components podem classificar-los en:
Arquitectura dels FiltresLa internacionalització té en consideració la configuració de l'idioma de l'usuari al seu navegador. D'aquesta forma, els literals mostrats s'obtindran del fitxer de traduccions associat a aquest idioma. En qualsevol cas, és possible especificar un paràmetre 'set-locale' amb el llenguatge i el país com a valor separats per '_'. En el següent diagrama podem veure quin és el procediment de tractament de tota petició:
Finalment, amb el locale obtingut es realitzen 3 pasos:
Interfícies i Components GenéricsEs pot trobar tota la documentació JavaDoc y el codi font referent aquests components a les següents urls: JavaDoc: http://canigo.ctti.gencat.net/confluence/canigodocs/site/canigo2_0/canigo-services-i18n/apidocs/index.html Instal- lació i ConfiguracióInstal- lacióLa instal- lació del servei requereix de la utilització de la llibreria 'canigo-services-i18n' i les dependències indicades a l'apartat 'Introducció-Versions i Dependències'. ConfiguracióPer a configurar el servei de multi idioma s'han de manipular els següents fitxers:
Definició de la Font de Missatges Com a class del bean podem especificar els següents valors:
Està basada en la classe 'ResourceBundle' que no permet la recàrrega dels missatges en temps d'execució. El fet de recarregar els missatges no és crític, ja que depèn de la forma de desplegar l'aplicació en el nostre servidor. Per totes les classes indicades podem especificar les següents propietats:
Definició del Servei Atributs:
Per aquesta classe podem definir les següents propietats:
Exemple:
<bean id="defaultLocale" class="java.util.Locale"> <constructor-arg type="String"><value>es</value></constructor-arg> </bean> <bean id="i18nService" class="net.gencat.ctti.canigo.services.i18n.impl.SpringI18nServiceImpl"> <!-- Propietat que referència a la font de missatges --> <property name="messageSource" ref="messageSource"/> <property name="defaultLocale" ref="defaultLocale"/> </bean> <!-- Font de missatges --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> ... </bean> Definició dels Fitxers de Traducció Ubicació: Els fitxers s'han de trobar en el classpath de l'aplicació. Es pot configurar la seva localització mitjançant la propietat baseNames (veure 'Definició de la Font de Missatges'). En el cas que especifiquem com a 'baseName' 'i18n/application' i ens trobem en una aplicació Web la cerca del fitxer es realitzarà al directori 'WEB-INF/classes/i18n'. Els fitxers de traducció són els fitxers que contenen els missatges en els diferents idiomes. Es basen en l'ús de la internacionalització de Java (i18n o Internationalization). Aquests fitxers s'han de construir tenint en compte que:
#fitxer de multi idioma application.properties
on 'lg correspon al codi del llenguatge i 'pa' correspon al codi del país pel qual volem definir els literals. El codi del país és opcional, pel que podem definir un fitxer en el format: Es poden consultar quines són les codificacions per cada llenguatge i país a: http://www.unicode.org/unicode/onlinedat/languages.html
Exemple:
? Important És important que es proporcioni un fitxer de recursos per defecte. Aquest serà el fitxer utilitzat pel servei en cas de que el llenguatge escollit per l'usuari no correspongui a cap dels fitxers de recursos definits. En cas de que per un llenguatge determinat existeixi un fitxer específic, l'obtenció del literal a partir d'una clau s'obtindrà des d'aquest fitxer. Si no es troba la clau en cap cas s'anirà al fitxer per defecte. Així doncs és important que es mantinguin actualitzats els fitxers de recursos per cada idioma de l'aplicació per evitar problemes. Definició de la Integració amb el servei de presentació Fitxer de configuració: web.xml Ubicació proposada: <PROJECT_ROOT>/src/main/webapp/WEB-INF/web.xml
Aquest filtre s'encarrega de integrar el Servei Atributs:
Aquest filtre s'encarrega de integrar el Servei Atributs:
Utilització del ServeiCanviar l'Idioma de l'UsuariEs pot canviar l'idioma d'un usuari passant un paràmetre a la request amb nom 'set-locale'. El valor d'aquest paràmetre ha de tenir el següent format: 'llenguatge_país', on llenguatge correspon a la codificació del llenguatge i país a la seva codificació També es pot passar únicament el llenguatge. Obtenció de TraduccionsPodem obtenir les traduccions d'un missatge amb els mètodes proporcionats per la interfície: # public String getMessage(String code): retorna un missatge a partir de la seva clau i del 'Locale' per defecte (getDefaultLocale()). En els mètodes en el que no passem el Locale, es farà ús del llenguatge escollit per l'usuari (veure anterior apartat). En cas de no trobar-se cap llenguatge s'usarà el llenguatge per defecte (definit com a propietat del servei 'defaultLocale' o en cas de no trobar-se segons el locale de la màquina virtual). Integració amb Altres ServeisEl Servei d'Internacionalització canigo es tracta d'un servei àmpliament utilitzat des de varis components de la capa de Presentació, principalment en el Servei de Tags. ExemplesExemple de Test UnitariCom a exemple d'utilització es mostra cóm podem fer una prova unitària:
i els fitxers dels diferents idiomes (application_XX_XX.properties) #application.properties (fitxer per defecte) #application_en_US.properties (fitxer pel 'Locale' 'US') #application_en_GB.properties (fitxer pel 'Locale' 'GB')
|